// vue中的虚拟DOM
export default class VNode {
  // constructor 方法用于创建初始化类的对象
  constructor (tag, data, children, text, elm, context, componentOptions, asyncFactory) {
    this.tag = tag // 当前节点的标签名
    this.data = data // 当前节点对应的对象 包含了具体的一些数据信息
    this.children = children // 当前节点的子节点 array
    this.text = text // 当前节点的文本
    this.elm = elm // 当前虚拟节点对应的真实DOM节点
    this.ns = undefined // 当前节点的命名空间
    this.context = context // 当前组件节点对应的Vue实例
    this.functionContext = undefined
    this.functionOptions = undefined
    this.key = data && data.key // 节点的key 属性 被当作节点的标志
    this.componentOptions = componentOptions
    this.componentInstance = undefined
    this.parent = undefined
    this.raw = false
    this.isStatic = false // 静态节点的标志
    this.isRootInsert = false // 是否作为节点插入
    this.isComment = false // 是否为注释节点
    this.isCloned = false // 是否为克隆节点
    this.isOnce = false // 是否有v-once 指令
    this.asyncFactory = asyncFactory
    this.asyncMeta = undefined
    this.usAsyncPlaceholder = false
  }
  get child () {
    return this.componentInstance // 返回当前组件的实例
  }
}
/**
 * 创建注释节点 
 * @param {*} text 注释节点的文本 
 * @returns 
 */
export const createEmptyVNode = text => {
  const node = new VNode()
  node.text = text
  node.isComment = true // 是否为注释节点
  return node
}
/**
 * 创建文本节点
 * @param {*} val 
 * @returns 
 */
export const createTextVNode = val => {
  return new VNode(undefined, undefined, undefined, String(val))
}
/**
 * 创建克隆节点
 * @param {*} vnode 
 * @param {*} deep 
 * @returns 
 */
export const cloneVNode = (vnode, deep) => {
  const cloned = new VNode(vnode.tag, vnode.data, vnode.children, vnode.text, vnode.elm, vnode.context, vnode.componentOptions, vnode.asyncFactory)
  cloned.ns = vnode.ns // 当前节点的命名空间
  cloned.isStatic = vnode.isStatic
  cloned.key = vnode.key
  cloned.isCloned = true // 是否是克隆节点
  if (deep && vnode.children) {
    cloned.children = cloneVNode(vnode, children)
  }
  return cloned
}
let vnode = new VNode()
console.log(vnode);